leetcode Roman to int

leetcode Roman to interger

罗马数字的介绍

wiki上对于罗马数字的介绍
此处需要特别的注意的是:
右加左减:

  • 在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
  • 在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
  • 左减的数字有限制,仅限于I、X、C。比如45不可以写成VL,只能是XLV。
  • 但是,左减时不可跨越一个位值。比如,99不可以用IC(100 - 1)表示,而是用XCIX([100 - 10] + [10 - 1])表示。(等同于阿拉伯数字每位数字分别表示。)
  • 左减数字必须为一位,比如8写成VIII,而非IIX。
  • 右加数字不可连续超过三位,比如14写成XIV,而非XIIII。(见下方“数码限制”一项。)

13. Roman to Integer(https://leetcode.com/problems/roman-to-integer/)

解题思路:
这个首先得判断出左减的情况,假设现在访问的是索引为i的位置,则可以判断出str[i]和str[i-1]表示的数字的大小优先级,从而得出是否为左减的结论

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
string intToRoman(int num) {
string roman[13] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
int val[13] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
string ret;

for(int i=0; i<13; i++) {
if(num>=val[i]) {
int count = num/val[i];
num %= val[i];
for(int j=0; j<count; j++) {
ret.append(roman[i]);
}
}
}
return ret;
}
};

interger to roman

题目:
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
解题思路:
首先将左减得全部值表示出来,然后将需要表示的数字从最大的罗马数字开始表示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
string intToRoman(int num) {
string roman[13] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
int val[13] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
string ret;

for(int i=0; i<13; i++) {
if(num>=val[i]) {
int count = num/val[i];
num %= val[i];
for(int j=0; j<count; j++) {
ret.append(roman[i]);
}
}
}
return ret;
}
};